/* 
场景: 有一种类型, 它有确定实现的行为, 也有不确定实现的行为

抽象类
  不能创建实例对象, 只有实现类才能创建实例
  可以包含未实现的抽象方法
*/
(() => {
 
 
 
 
 
 // 能不能定义成接口? => 不可以, 接口不可以包含实现方法 => 都是抽象方法
 // 能不能定义成类 => 
    // 实现类: 包含的都是实现方法  => 可以创建实例对象
    // 抽象类: 可以包含未实现的方法 (简称: 抽象方法) => 不能直接创建实例对象

 
 
 
  // 抽象类: 可以有抽象方法和实现方法, 不能创建实例
  abstract class Animal {
    abstract cry (): void // 约定了所有的实例类得实现这个方法, 当前还不知道怎么实现
    
    run () { // 当前我知道怎么实现
      console.log('run')
    }
  }

  // 实现类: 只有实现方法, 不能有抽象方法, 可以创建实现
  class Dog extends Animal { // 实现类中是不能有抽象方法
    
    cry (): void {
      console.log('dog cry')
    }
  }

  class Cat extends Animal {
    cry (): void {
      console.log('Cat cry')
    }
  }

  const d = new Dog()
  // new Animal()  // error 抽象类不能创建实例

  /* 
  实现类: 所有方法都实现方法
  抽象类: 方法可以是实现方法和抽象方法
  接口: 所有方法都是抽象方法
  */

})()